<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
  <meta charset="utf-8">
  <title>Tcl 和 expect教程 &mdash; cat writebug.cn/history</title>
  <meta name="author" content="zhiliao">
  <meta name="description" content="Tcl 和 expect教程" />

  <meta name="keywords" content="开发者,程序,博客园,程序猿,程序媛,极客,码农,编程,代码,软件开发,开源,IT网站,技术社区,Developer,Programmer,Coder,Geek,Coding,Code,writebug,bug,写bug,linux,vim,编程语言,调试" />

  <link href="/feeds/all.atom.xml" type="application/rss+xml" rel="alternate"
        title="cat writebug.cn/history RSS Feed" />





  <!-- http://t.co/dKP3o1e -->
  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width, initial-scale=1">


    <link href="/favicon.png" rel="icon">

  <link href="/theme/css/main.css" media="screen, projection"
        rel="stylesheet" type="text/css">
  <link href="/theme/css/pygment.css" rel="stylesheet" type="text/css">

  <!--
  <link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
  <link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
  -->


  <script src="/theme/js/modernizr-2.0.js"></script>
  <script src="/theme/js/ender.js"></script>
  <script src="/theme/js/octopress.js" type="text/javascript"></script>
</head>

<body >
  <header role="banner"
  >
<hgroup>
  <h1><a href="/">cat writebug.cn/history</a></h1>
    <h2>一个开发者的技术博客。</h2>
</hgroup></header>
  <nav role="navigation"><ul class="subscription" data-subscription="rss">
  <li><a href="/feeds/all.atom.xml" rel="subscribe-rss">RSS</a></li>
</ul>


<ul class="main-navigation">
    <li><a href="/">Home</a></li>
    <li><a href="/archives.html">Archive</a></li>
    <li><a href="/pages/todolist.html">TodoList</a></li>
    <li><a href="/pages/about.html">About</a></li>
</ul></nav>
  <div id="main">
    <div id="content">
<div>
  <article class="hentry" role="article">
<header>
      <h1 class="entry-title">Tcl 和 expect教程</h1>
    <p class="meta">
<time datetime="2023-08-04T22:08:51+08:00" pubdate>2023-08-04 22:08:51</time>      
    </p>
</header>

    <div class="entry-content"><h1>expect</h1>
<p>expect是用于命令行自动化交互的程序，相当于命令行版本的按键精灵。可以用来输入密码，操作程序。</p>
<ul>
<li>expect基于Tcl/Tk实现，在expect脚本中使用Tcl语法和支持Tcl命令。</li>
<li>通过添加Tk,你可以把命令行程序封装在Gui中。</li>
<li>O'Reilly提供了一本关于Expect的书，书名为"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Applications", ISBN 1-56592-090-2.</li>
<li>autoexpect 这是expect安装包提供的命令，支持录制expect脚本，录制好后稍微修改就能运行。</li>
<li>shebang里面写<code>#!/usr/local/bin/expect −−</code> --的作用是给脚本传递用户参数时避免被当成expect自身的参数。脚本可以从argv里面读取用户传递的参数。</li>
<li>脚本参数在Tcl里面是<code>$argc $argv0 $argv</code> $argc表示参数个数，$argv0相当于C语言中的argv[0], $argv是一个Tcl list, 使用<code>[lindex $argv index]</code>来访问。</li>
<li>Tcl 变量用<code>set 变量名 变量值</code>定义。变量用<code>$变量名</code>访问。</li>
<li>Tcl if语句通常写法为 if { 条件 } { 条件执行内容 } elseif {条件} {执行内容} else {执行内容}</li>
<li>Tcl while语句通常写法为 while { 条件} { 循环体 }</li>
<li>Tcl foreach语句通常写法为 <code>foreach 变量名 列表 { 执行内容 }</code>。 while循环和foreach循环支持continue 和break。</li>
</ul>
<div class="highlight-custom"><pre><span></span><code><span class="n">常用命令</span>
<span class="n">spawn</span><span class="w"> </span><span class="n">启动要交互的应用程序</span>
<span class="n">send</span><span class="w"> </span><span class="n">用于向进程发送字符串</span><span class="err">，</span><span class="n">换行符或者回车符</span><span class="err">\</span><span class="n">r</span><span class="w"> </span><span class="n">确认输入</span><span class="err">。</span>
<span class="n">send_user</span><span class="w"> </span><span class="n">用来打印输出</span><span class="err">，</span><span class="w"> </span><span class="n">和tcl中puts差不多</span><span class="err">。</span>
<span class="n">interact</span><span class="w"> </span><span class="n">允许用户交互</span>
<span class="n">exit</span><span class="w"> </span><span class="n">退出expect脚本</span>
<span class="n">eof</span><span class="w"> </span><span class="n">expect执行结束</span>
<span class="n">exec</span><span class="w"> </span><span class="n">执行程序</span>
<span class="n">sleep</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">暂停5秒</span>


<span class="n">expect</span><span class="w"> </span><span class="n">命令作用</span><span class="err">：</span><span class="n">等待</span><span class="err">，</span><span class="n">直到其中一个模式与派生进程的输出匹配</span><span class="err">，</span><span class="n">超时</span><span class="err">，</span><span class="n">或者遇到文件结尾</span><span class="err">。</span>
<span class="n">expect支持多分支匹配</span><span class="p">,</span><span class="w"> </span><span class="n">用法如下</span>
<span class="n">expect</span><span class="w"> </span><span class="p">[</span><span class="n">pat1</span><span class="w"> </span><span class="n">body1</span><span class="p">]</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="n">patn</span><span class="w"> </span><span class="p">[</span><span class="n">bodyn</span><span class="p">]</span>

<span class="n">exp_continue</span><span class="w"> </span><span class="n">在expect中多模式匹配就需要用到</span><span class="err">，</span><span class="n">允许expect本身继续执行</span><span class="err">，</span><span class="n">而不是按原样返回</span><span class="err">。</span>
<span class="n">set</span><span class="w"> </span><span class="n">timeout</span><span class="w"> </span><span class="n">定义expect超时的时间</span>

<span class="n">一个例子</span><span class="err">：</span>
<span class="cp">#!/usr/bin/expect</span>
<span class="n">set</span><span class="w"> </span><span class="n">timeout</span><span class="w"> </span><span class="mi">5</span>

<span class="n">expect</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="nl">Password</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">send_user</span><span class="w"> </span><span class="s">&quot;password (for $user) on $host: &quot;</span>
<span class="w">    </span><span class="n">expect_user</span><span class="w"> </span><span class="o">-</span><span class="n">re</span><span class="w"> </span><span class="s">&quot;(.*)</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="w">    </span><span class="n">send_user</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="w">    </span><span class="n">send</span><span class="w"> </span><span class="s">&quot;$expect_out(1,string)</span><span class="se">\r</span><span class="s">&quot;</span>
<span class="w">    </span><span class="n">exp_continue</span>
<span class="p">}</span><span class="w"> </span><span class="n">incorrect</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">send_user</span><span class="w"> </span><span class="s">&quot;invalid password or account</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="w">    </span><span class="n">exit</span>
<span class="p">}</span><span class="w"> </span><span class="n">timeout</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">send_user</span><span class="w"> </span><span class="s">&quot;connection to $host timed out</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="w">    </span><span class="n">exit</span>
<span class="p">}</span><span class="w"> </span><span class="n">eof</span><span class="w"> </span><span class="p">{</span>
<span class="n">send_user</span><span class="w"> </span>\
<span class="w">    </span><span class="s">&quot;connection to host failed: $expect_out(buffer)&quot;</span>
<span class="w">    </span><span class="n">exit</span>
<span class="p">}</span><span class="w"> </span><span class="o">-</span><span class="n">re</span><span class="w"> </span><span class="n">$prompt</span>
</code></pre></div>

<h1>Tcl语言学习</h1>
<h2>Tcl语言介绍</h2>
<ul>
<li>最早称为“工具命令语言” Tool Command Language</li>
<li>跨平台</li>
<li>容易学习</li>
<li>方便图形界面编程（Tk）</li>
<li>既可以交互式执行脚本，也可以内嵌到其他程序中</li>
<li>支持事件循环</li>
<li>支持package</li>
</ul>
<h2>语法（man Tcl）</h2>
<ul>
<li>分号和换行分隔命令，命令和参数之间用空格/tab分割。<code>#</code>是单行注释，注释字符只有出现在一个命令开始时才有意义。</li>
<li>命令求值过程：1. 解释器把命令分解成字worlds, 完成替换。2. 第一个字是执行过程，后面的字作为执行过程的参数。</li>
<li><code>""</code>双引号内的内容表示一个“字”， 在引号之间的字符上会进行命令替换、变量替换、和反斜杠替换。</li>
<li><code>{}</code>花括号内的内容表示一个“字”，花括号可以嵌套， 花括号会按照层级进行匹配。在花括号之间的字符上不进行替换，对分号、换行、右方括号、或白空格不做特殊的解释。（除了下面描述的反斜杠-换行替换之外）。字由外侧的花括号之间的字符精确的组成，不包括花括号自身。</li>
<li><code>[]</code>方括号之间的内容Tcl进行命令替换。将递归调用Tcl解释器来把方括号中的字符作为一个Tcl脚本处理。脚本的结果将被替换到字方括号的位置。。在一个单一的字中可以有任意数目的命令替换。在由花括号包起来的字上不进行命令替换。</li>
<li><code>$</code>开始的字，Tck会进行变量替换。支持<code>$name</code> <code>${name}</code>, 替换数组时用<code>$name(index)</code>。index的字符将被进行命令替换、变量替换、和反斜杠替换。<code>${name}</code>可以包含除了右括号之外的任何字符。一个单一的字中可以有任意数目的变量替换。在由花括号包起来的字上不进行命令替换。</li>
<li>用<code>\</code>反斜线进行转义。支持的转义字符有<code>\a \b \f \n \r \t \v \{ \} \\</code>。<code>\&lt;newline&gt;whiteSpace</code>用来替换换行+空格的，整体会被替换为一个空格。</li>
<li><code>\</code>转义符号也支持unicode。<code>\ooo</code> o是最多三个的8进制字符。<code>\xhh</code> h是最多2个的16进制字符。<code>\uhhhh</code> 最多4个的16进制字符。这些会被替换成unicode字符。除了<code>\&lt;newline&gt;whiteSpace</code>，其他在由花括号包起来的字上不进行反斜杠替换。</li>
<li>替换不影响一个命令的字边界。例如，即使变量的值包含空格，在变量替换期间变量的整个的值成为一个单一的字的一部分。</li>
</ul>
<h2>备注</h2>
<ul>
<li>有个交互式解释器tclsh, 可以作为操作系统的shell使用</li>
<li>没有数字类型，可以认为只有Tck中的一切都是字worlds构成。</li>
<li>三种替换，分别是命令替换[]， 变量替换$，反斜线替换。</li>
</ul>
<h2>自己瞎点评Tcl语言</h2>
<ul>
<li>函数传参和bash脚本一样，在进入函数前要把列表先展开，然后传递给命令，注定了效率低。</li>
<li>如果没有在参数中展开的变量，比如array这种不支持直接展开的，要在函数内用upvar命令获取上层函数的变量。使用起来不太方便。</li>
<li>不支持类型，一切都是token list，这个特点也让Tcl不能很方便的操作json等带类型的复杂数据结构。比如json里面的"100"是个字符串，转到Tcl里面类型就会丢失和100没区别。而python的json和dict互转就非常自然。</li>
<li>从语言定位来看, Tcl 应该是介于bash script和lua/python之间的编程语言。字符串处理和数据运算比bash方便，调用系统命令方便，也带json数据库网络图形界面支持，适合用来写不太复杂，但又要操作数据或者需要gui的脚本。</li>
</ul>
<h2>常用命令</h2>
<ul>
<li>查看Tcl命令帮助可以<code>man 3Tcl 命令</code></li>
<li><code>set 变量 值</code>能够设置变量的值, 无需声明变量。</li>
<li><code>unset 变量</code>移除变量</li>
<li><code>puts WORLDS</code> 显示，支持worlds中支持变量替换</li>
</ul>
<h3>条件执行和循环</h3>
<p>if根据条件执行脚本。使用方法<code>if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?</code>。前后有问号的worlds是可以省略的。
if命令把expr1作为一个表达式来求值(用与expr求值它的参数相同的方式)。这个表达式的值必须式一个boolean值(一个数值值，这里0是假而任何其他数值都是真；或者是一个字符串值，比如true或yes是真 而false或no是假)；如果它是真通过把body1传递给Tcl解释器来执行它。
由于expr1 和 body1是一个表达式（worlds）, 所以一般要用{}或双引号引起来传递给if。不能乱换行，换行需要在<code>{或者"</code>中。
then和else是可选的“噪音词”用来使命令易读。命令的返回值是被执行的那个脚本的返回值。</p>
<ul>
<li>expr命令会首先用空格连接所有参数，在命令提换和变量替换后，计算表达式的值，和C语言差不多。 详见<code>man 3tcl expr</code></li>
</ul>
<div class="highlight-custom"><pre><span></span><code><span class="k">if</span><span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nv">$name</span><span class="w"> </span><span class="nv">zhangsan</span><span class="w"> </span><span class="k">}</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="k">{</span>
<span class="w">    </span><span class="nb">puts</span><span class="w"> </span>nihao
<span class="k">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">{</span>
<span class="w">    </span><span class="nb">puts</span><span class="w"> </span>hello
<span class="k">}</span>

<span class="k">if</span><span class="w"> </span><span class="err">”</span><span class="nv">$age</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">14</span><span class="err">“</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="s2">&quot;</span>
<span class="s2">    puts &gt;=14</span>
<span class="s2">&quot;</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s2">&quot;</span>
<span class="s2">    puts &lt;14</span>
<span class="s2">&quot;</span>
<span class="k">if</span><span class="w"> </span>和<span class="w"> </span><span class="k">{</span><span class="w"> </span><span class="nv">之间要有空格</span><span class="err">，</span>否则会被Tcl当作一个整体<span class="err">。</span>
<span class="nv">第一个if更易读</span><span class="err">。</span>
<span class="nv">这两个区别是用花括号时候</span><span class="w"> </span><span class="err">`</span><span class="nv">$name</span><span class="err">`</span><span class="w"> </span>是在if外面被求值<span class="err">。</span>用双引号则<span class="err">`</span><span class="nv">$age</span><span class="err">`</span><span class="w"> </span>在if命令里面被求值<span class="err">（</span>替换<span class="err">）。</span>
</code></pre></div>

<ul>
<li><code>while test body</code>循环。</li>
</ul>
<h3>其他流程控制</h3>
<div class="highlight-custom"><pre><span></span><code><span class="nv">foreach</span>
<span class="nv">switch</span>

<span class="k">continue</span><span class="w"> </span>和<span class="nv">break</span><span class="w"> </span>和<span class="nv">C</span>语言中一样。
</code></pre></div>

<h3>字符串处理</h3>
<ul>
<li>string命令用于字符串处理</li>
</ul>
<h3>list （man 3tcl list）</h3>
<ul>
<li><code>list ?arg arg ...?</code>这个命令返回由所有arg组成的一个列表。如果未指定arg 则返回一个空串。</li>
</ul>
<div class="highlight-custom"><pre><span></span><code>list  直接用原始参数来工作。例如，命令
    list a b {c d e} {f {g h}}
将返回
    a b {c d e} {f {g h}}
</code></pre></div>

<ul>
<li>创建list变量的三种方法<code>set arr "1 2 3 4"</code> <code>set arr {1 2 3 4}</code> <code>set arr [list 1 2 3 4]</code></li>
<li>list相关命令用l开头，可以在tclsh中输入l,查询list相关命令有哪些。<code>lappend lassign lindex linsert list llength lmap load lrange lrepeat lreplace lreverse lsearch lset lsort</code></li>
<li>llength 获取元素个数字符串</li>
<li>lrange 截取子list</li>
<li>lindex 根据index获取元素</li>
<li>linsert 插入</li>
<li>lset 修改指定位置的元素</li>
<li>lreplace 相当于字符串的replace，可以替换为0个到多个元素。</li>
<li>lconat 合并list</li>
<li>lappend 追加list元素</li>
<li>lrepeat 把value重复N次，得到一个list</li>
<li>join 相当于字符串的join。</li>
<li>split 把一个字符串分离成一个Tcl列表</li>
<li>lsearch 搜索list,支持严格匹配，通配符，或者正则匹配</li>
</ul>
<h3>array数组变量 （man 3tcl array）</h3>
<ul>
<li><code>array set arrayName list</code>创建array,list由偶数个元素组成，每个奇数元素被作为在array中被作为一个index对待。</li>
<li><code>array get arrayName ?pattern?</code> 成对的返回数组元素列表。</li>
<li><code>array size arrayName</code> 返回元素个数字符串</li>
<li><code>glob partten</code> 用于匹配文件路径，支持通配符<code>*?[char]</code></li>
</ul>
<h3>创建命令（函数）</h3>
<p><code>proc name args body</code>
args是一个列表，可以为空，每个元素指定一个参数。每个参数指定符也可以是有一个或两个字段个列表。如果有两个字段，则第一个是参数名而第二个是参数的默认值。</p>
<h3>文件操作</h3>
<div class="highlight-custom"><pre><span></span><code>常用命令介绍
open
close
file
eof
gets
</code></pre></div>

<h3>其他重要的命令</h3>
<div class="highlight-custom"><pre><span></span><code><span class="nv">format</span><span class="w"> </span>按<span class="nv">sprintf</span>格式输出
<span class="k">exec</span><span class="w"> </span>调用可执行程序
<span class="nv">source</span><span class="w"> </span>执行脚本
<span class="nv">info</span><span class="w"> </span>判断变量是否存在
<span class="k">exit</span>
<span class="nv">expr</span>
<span class="nv">eval</span>
<span class="nv">incr</span>
<span class="nv">socket</span><span class="w"> </span>#<span class="w"> </span><span class="nv">tcp</span>服务端客户端
<span class="nv">encoding</span>
<span class="nv">dict</span>
<span class="nv">json</span>


<span class="nv">man</span><span class="w"> </span><span class="mi">3</span><span class="nv">tcl</span><span class="w"> </span><span class="nv">namespace</span>
<span class="nv">man</span><span class="w"> </span><span class="mi">3</span><span class="nv">tcl</span><span class="w"> </span><span class="nv">package</span>
<span class="nv">ls</span><span class="w"> </span><span class="o">/</span><span class="nv">usr</span><span class="o">/</span><span class="nv">share</span><span class="o">/</span><span class="nv">man</span><span class="o">/</span><span class="nv">zh_CN</span><span class="o">/</span><span class="nv">man3</span><span class="cm">/*tcl</span>
<span class="cm">rpm -ql tcl</span>
<span class="cm">rpm -ql tcllib</span>
<span class="cm">rpm -ql tclx</span>
</code></pre></div></div>
    <footer>
<p class="meta">
  <span class="byline author vcard">
    Posted by <span class="fn">
        zhiliao
    </span>
  </span>
<time datetime="2023-08-04T22:08:51+08:00" pubdate>2023-08-04 22:08:51</time>  <span class="categories">
    <a class='category' href='/category/programming.html'>programming</a>
  </span>
  <span class="categories">
    <a class="category" href="/tag/programming.html">programming</a>  </span>
</p><div class="sharing">
</div>    </footer>
  </article>

</div>

<aside class="sidebar">
<section>
  <h1>Recent Posts</h1>
  <ul id="recent_posts">
    <li class="post">
        <a href="/posts/2023/08/22/bash-conversion.html">bash进制转换</a>
    </li>
    <li class="post">
        <a href="/posts/2023/08/16/remap-caps-ctrl.html">在Linux下交换Ctrl与大写锁定键</a>
    </li>
    <li class="post">
        <a href="/posts/2023/08/15/learn-java.html">java入门精粹</a>
    </li>
    <li class="post">
        <a href="/posts/2023/08/04/tcl-expect.html">Tcl 和 expect教程</a>
    </li>
    <li class="post">
        <a href="/posts/2023/08/01/armbian-config-software.html">armbian-config 支持自动安装的软件</a>
    </li>
  </ul>
</section><section>
  <h1>Categories</h1>
    <ul id="recent_posts">
      <li><a href="/category/android.html">android (2)</a></li>
      <li><a href="/category/blog.html">blog (1)</a></li>
      <li><a href="/category/bootloader.html">bootloader (2)</a></li>
      <li><a href="/category/container.html">container (1)</a></li>
      <li><a href="/category/database.html">database (1)</a></li>
      <li><a href="/category/editor.html">editor (4)</a></li>
      <li><a href="/category/filesystem.html">filesystem (1)</a></li>
      <li><a href="/category/firefox.html">firefox (1)</a></li>
      <li><a href="/category/git.html">git (4)</a></li>
      <li><a href="/category/golang.html">golang (1)</a></li>
      <li><a href="/category/gu-piao.html">股票 (1)</a></li>
      <li><a href="/category/ide.html">IDE (1)</a></li>
      <li><a href="/category/interview.html">interview (1)</a></li>
      <li><a href="/category/linux.html">linux (51)</a></li>
      <li><a href="/category/network.html">network (7)</a></li>
      <li><a href="/category/nltk.html">nltk (2)</a></li>
      <li><a href="/category/notes.html">notes (1)</a></li>
      <li><a href="/category/other.html">other (1)</a></li>
      <li><a href="/category/programming.html">programming (10)</a></li>
      <li><a href="/category/python.html">python (1)</a></li>
      <li><a href="/category/software.html">software (1)</a></li>
      <li><a href="/category/stock.html">stock (1)</a></li>
      <li><a href="/category/storage.html">storage (2)</a></li>
      <li><a href="/category/vm.html">vm (1)</a></li>
      <li><a href="/category/web.html">web (4)</a></li>
      <li><a href="/category/windows.html">windows (1)</a></li>
      <li><a href="/category/xwindow.html">xwindow (1)</a></li>
  </ul>
</section>
<section>
  <h1>Tags</h1>
    <a href="/tag/linux.html">linux</a>,    <a href="/tag/bash.html">bash</a>,    <a href="/tag/xwindow.html">Xwindow</a>,    <a href="/tag/programming-language.html">programming-language</a>,    <a href="/tag/java.html">java</a>,    <a href="/tag/programming.html">programming</a>,    <a href="/tag/software.html">software</a>,    <a href="/tag/storage.html">storage</a>,    <a href="/tag/debug.html">debug</a>,    <a href="/tag/c.html">C</a>,    <a href="/tag/git.html">git</a>,    <a href="/tag/patch.html">patch</a>,    <a href="/tag/text.html">text</a>,    <a href="/tag/selenium.html">selenium</a>,    <a href="/tag/web.html">web</a>,    <a href="/tag/docker.html">docker</a>,    <a href="/tag/flatpak.html">flatpak</a>,    <a href="/tag/interview.html">interview</a>,    <a href="/tag/qt.html">Qt</a>,    <a href="/tag/opensuse.html">openSUSE</a>,    <a href="/tag/filesystem.html">filesystem</a>,    <a href="/tag/ide.html">IDE</a>,    <a href="/tag/glang.html">glang</a>,    <a href="/tag/xdg.html">xdg</a>,    <a href="/tag/network.html">network</a>,    <a href="/tag/raspberry.html">raspberry</a>,    <a href="/tag/vm.html">vm</a>,    <a href="/tag/windows.html">windows</a>,    <a href="/tag/gdb.html">gdb</a>,    <a href="/tag/debian.html">debian</a>,    <a href="/tag/archlinux.html">archlinux</a>,    <a href="/tag/phicomm.html">phicomm</a>,    <a href="/tag/kernel.html">kernel</a>,    <a href="/tag/ext4.html">ext4</a>,    <a href="/tag/server.html">server</a>,    <a href="/tag/stock.html">stock</a>,    <a href="/tag/shu.html">书</a>,    <a href="/tag/gu-piao.html">股票</a>,    <a href="/tag/python.html">python</a>,    <a href="/tag/nltk.html">nltk</a>,    <a href="/tag/command.html">command</a>,    <a href="/tag/shell.html">shell</a>,    <a href="/tag/terminal.html">terminal</a>,    <a href="/tag/other.html">other</a>,    <a href="/tag/wireless.html">wireless</a>,    <a href="/tag/android.html">android</a>,    <a href="/tag/gtk.html">gtk+</a>,    <a href="/tag/gnome.html">gnome</a>,    <a href="/tag/keyboard.html">keyboard</a>,    <a href="/tag/firefox.html">firefox</a>,    <a href="/tag/arch.html">arch</a>,    <a href="/tag/database.html">database</a>,    <a href="/tag/mysql.html">mysql</a>,    <a href="/tag/notes.html">notes</a>,    <a href="/tag/sysctl.html">sysctl</a>,    <a href="/tag/vim.html">vim</a>,    <a href="/tag/editor.html">editor</a>,    <a href="/tag/pelican.html">pelican</a>,    <a href="/tag/blog.html">blog</a>,    <a href="/tag/book.html">book</a>,    <a href="/tag/bootloader.html">bootloader</a></section>
    <section>
        <h1>Social</h1>
        <ul>
            <li><a href="https://github.com/zhangjiaxing" target="_blank">github</a></li>
            <li><a href="http://wpa.qq.com/msgrd?v=3&uin=347820393&site=qq&menu=yes" target="_blank">qq</a></li>
            <li><a href="http://www.writebug.cn" target="_blank">blog</a></li>
            <li><a href="http://gallery.writebug.cn" target="_blank">gallery</a></li>
        </ul>
    </section>
    <section>
        <h1>Blogroll</h1>
        <ul>
            <li><a href="http://getpelican.com/" target="_blank">Pelican</a></li>
        </ul>
    </section>

</aside>
    </div>
  </div>
  <footer role="contentinfo">
<p>
    Copyright &copy;  2013&ndash;2023  zhiliao &mdash;
  <span class="credit">Powered by <a href="http://getpelican.com">Pelican</a></span>
</p>  </footer>
</body>
</html>